package com.common.utils;

/**
 * @author xin.ding
 * @date 2019/12/12 9:51
 */
public class JsonUtils {



    /**
     * 判断 \是否为转义符 如果后一个字符为"|n|t|r ...等则为转义符
     *
     * @param ch 字符
     * @return 是否转义符
     */
    private static boolean isEscape(char ch) {
        return (ch == '"' || ch == '\\'  || ch == 'r'
                || ch == 'n' || ch == 'b' || ch == 't' || ch == 'f');
    }


    /**
     * 对Json数据进行转义（“ \）等使其正常解析<br/>
     * <p>
     * 引号转义逻辑：对第二次出现的引号的下一个字符判断，如果不为 ： ， ｝ 则进行转义<br/>
     * 缺陷：如果引号中数据为 ： ， ｝ 则无法正确转义 例：“，aaa” ":aaa" "}aaa"
     *
     * @param json Json字符串
     * @return 处理后字符串
     */
    public static String escapeQuote(String json) {
        final StringBuilder result = new StringBuilder();
        char[] charArray = json.toCharArray();
        //引号计数器，1表示开始出引号，2表示结束处引号
        int count = 0;
        for (int i = 0; i < charArray.length; i++) {
            if (charArray[i] == '\n' || charArray[i] == '\r') {
                continue;
            }
            if (charArray[i] == '\\') {
                result.append('\\').append(charArray[i]);
                continue;
            }
            //"处理
            if ('"' == charArray[i]) {
                count++;
            }
            //count <=1时引号不用转义
            if (count <= 1) {
                result.append(charArray[i]);
            } else {
                //count为2时，下一个字符为 , : } 则认为是正常右引号，不用转义
                if (charArray[i + 1] == ':' || charArray[i + 1] == ',' || charArray[i + 1] == '}') {
                    result.append(charArray[i]);
                    count = 0;
                } else {
                    result.append("\\").append(charArray[i]);
                    count--;
                }
            }
        }
        return result.toString();
    }
}
